// http.js

import {API_URL} from './constant.js'

/**
 * 基于 jQuery 的 Ajax 封装工具类
 * 支持 GET、POST、PUT、DELETE 等请求方式
 * 统一携带请求头，统一处理异常
 */

// 默认请求头（可根据项目需要调整）
const DEFAULT_HEADERS = {
    'Content-Type': 'application/json',
    // 'Authorization': 'Bearer your_token_here' // 可以动态设置
    'token': localStorage.getItem('token') || ''
};

/**
 * 设置全局请求头（如 token）
 * @param {Object} headers - 需要设置的请求头对象
 */
export function setHeaders(headers) {
    Object.assign(DEFAULT_HEADERS, headers);
}

/**
 * 发送请求
 * @param {Object} options - 请求配置
 * @param {string} options.url - 请求地址
 * @param {string} [options.method='GET'] - 请求方法 GET/POST/PUT/DELETE 等
 * @param {Object} [options.data=null] - 请求数据（POST/PUT 等使用）
 * @param {Object} [options.headers={}] - 额外请求头（会合并到默认请求头中）
 * @returns {Promise} - 返回 Promise 对象
 */
export function request(options) {
    const {
        url,
        method = 'GET',
        data = null,
        headers = {}
    } = options;

    // 合并默认请求头和传入的请求头
    const requestHeaders = {...DEFAULT_HEADERS, ...headers};

    return new Promise((resolve, reject) => {
        $.ajax({
            url: API_URL + url,
            type: method,
            contentType: requestHeaders['Content-Type'] || 'application/json',
            headers: requestHeaders,
            data: method !== 'GET' ? JSON.stringify(data) : data,
            dataType: 'json',
            success: function (response) {
                // 可以在这里对返回的数据做统一处理，如判断业务状态码
                if (response.code === 200) { // 假设后端返回 { code: 200, data: ..., msg: '' }
                    resolve(response.data); // 只返回业务数据
                } else {
                    if(response.code === 520){
                        // 未登录异常,跳转至登录页
                        alert("重新登录")
                    }else {
                        // 业务逻辑错误（如 token 过期、参数错误等）
                        const error = new Error(response.msg || '业务逻辑错误');
                        error.code = response.code;
                        error.response = response;
                        reject(error);
                    }
                }
            },
            error: function (xhr, status, errorThrown) {
                let message = '网络请求失败';

                var response = {};
                response.code = 500;
                response.msg = message;
                response.data = null;

                const error = new Error(message);
                error.code = 500;
                error.response = response;
                reject(error);
            }
        });
    });
}

/**
 * GET 请求
 * @param {string} url - 请求地址
 * @param {Object} [params=null] - 查询参数
 * @param {Object} [headers={}] - 额外请求头
 * @returns {Promise}
 */
export function get(url, params = null, headers = {}) {
    return request({
        url: params ? `${url}?${new URLSearchParams(params).toString()}` : url,
        method: 'GET',
        headers
    });
}

/**
 * POST 请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求数据
 * @param {Object} [headers={}] - 额外请求头
 * @returns {Promise}
 */
export function post(url, data, headers = {}) {
    return request({
        url,
        method: 'POST',
        data,
        headers
    });
}

/**
 * PUT 请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求数据
 * @param {Object} [headers={}] - 额外请求头
 * @returns {Promise}
 */
export function put(url, data, headers = {}) {
    return request({
        url,
        method: 'PUT',
        data,
        headers
    });
}

/**
 * DELETE 请求
 * @param {string} url - 请求地址
 * @param {Object} [data=null] - 请求数据（部分接口可能需要在 body 中传参）
 * @param {Object} [headers={}] - 额外请求头
 * @returns {Promise}
 */
export function del(url, data = null, headers = {}) {
    return request({
        url,
        method: 'DELETE',
        data,
        headers
    });


    /**
     *  使用示例
     *
     import { setHeaders, get, post, put, del } from './http';

     // 设置全局请求头（如 token）
     setHeaders({
      'Authorization': 'Bearer your_jwt_token_here'
      });

     // GET 请求示例
     get('/api/user/info', { id: 123 })
     .then(data => {
          console.log('用户信息:', data);
      })
     .catch(error => {
          console.error('请求失败:', error.message);
          if (error.status === 401) {
          // 跳转到登录页
          }
      });

     // POST 请求示例
     post('/api/user/login', { username: 'admin', password: '123456' })
     .then(data => {
          console.log('登录成功:', data);
      })
     .catch(error => {
          console.error('登录失败:', error.message);
      });
     *
     */
}